﻿using System;
using System.ServiceModel;
using ClientProxy.CentralServiceReference;
using Contracts;

namespace ClientProxy
{
    public class User
    {
        static void Main(string[] args)
        {
            ClientCallback callback = new ClientCallback();
            CentralServiceClient proxy = new CentralServiceClient(new InstanceContext(callback));

            // Definir um contexto por cada cliente, por forma a que se possam identificar os clientes.
            // Só é possível porque, na definição do contracto, a propriedade SessionMode não tem o valor de SessionMode.NotAllowed
            //IContextManager ctxManager = proxy.InnerChannel.GetProperty<IContextManager>();
            //IDictionary<string, string> ctx = ctxManager.GetContext();

            //// Dados do cliente
            //Console.WriteLine("Introduza nome de cliente: ");
            //ctx["Name"] = Console.ReadLine();

            //ctxManager.SetContext(ctx);

            UserData data = new UserData();
            Console.WriteLine("Introduza o assunto: ");
            data.Subject = Console.ReadLine();
            Console.WriteLine("Introduza a linguagem: ");
            data.Language = Console.ReadLine();

            try
            {
                proxy.InitSubscription(data);

                Console.WriteLine("Identificador da sessão: {0}", proxy.InnerChannel.SessionId);
                do
                {
                    Console.WriteLine("Introduza a mensagem a enviar: ");
                    string msg = Console.ReadLine();
                    if (string.IsNullOrWhiteSpace(msg)) break;

                    try
                    {
                        proxy.DeliverMessage(data.Language, data.Subject, msg);
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine("A sua mensagem não foi entregue:\n {0}\n Tente novamente.", e.Message);
                    }
                } while (true);

                Console.WriteLine("A terminar a subscrição do serviço de entrega de mensagens...");
                try
                {
                    proxy.ExitSubscription(data.Subject);
                }
                catch (Exception e)
                {
                    Console.WriteLine("Não foi possível terminar normalmente a subscrição so serviço.\n{0}", e.Message);
                }
            }
            catch(Exception e)
            {
                Console.WriteLine("Não foi possível iniciar a subscrição so serviço.\n{0}", e.Message);
            }
            finally
            {
                Console.WriteLine("Terminou a aplicação!\nPrima Enter para fechar.");
                Console.ReadLine();
            }
        }
    }
}
